package main

import (
	"fmt"
	"log"
	"os"
	"path/filepath"
	"time"

	"wanfang-translation/pkg/txtinput"

	"github.com/spf13/viper"
)

/*
* 文本txt输入文件主程序
**/

func main() {
	// 设置工作路径
	setProjectRoot()

	// 设置日志
	if err := setupLogging(); err != nil {
		log.Fatalf("设置日志失败: %v", err)
	}

	// 读取config/config.yaml配置文件获取配置信息
	// 读取配置
	config, err := loadConfig()
	if err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}
	// 构建 MQ URL
	mqURL := fmt.Sprintf("amqp://%s:%s@%s:%d/",
		config.RabbitMQ.User,
		config.RabbitMQ.Password,
		config.RabbitMQ.Host,
		config.RabbitMQ.Port,
	)
	// 配置参数
	cfg := txtinput.TxtInputConfig{
		FilePath:  "./files/datasets", // 输入文件夹路径
		QueueName: "input_queue",      // 消息队列名称
		MqURL:     mqURL,              // RabbitMQ连接地址
	}

	// 创建处理器实例
	processor, err := txtinput.New(cfg)
	if err != nil {
		log.Fatalf("初始化失败: %v", err)
	}
	// 确保资源释放
	defer processor.Close()

	// 处理文件
	if err := processor.Process(); err != nil {
		log.Fatalf("处理文件失败: %v", err)
	}

	log.Println("文件处理完成")
}

// 设置工作路径，并完成路径变更
func setProjectRoot() {
	projectRoot := "../.." // 替换为你的项目根目录路径
	if err := os.Chdir(projectRoot); err != nil {
		log.Fatalf("设置工作目录失败: %v", err)
	}
}

func setupLogging() error {
	// 获取当前日期
	currentDate := time.Now().Format("2006-01-02")
	logDir := "logs"
	// 设置完成的日志路径
	logFile := fmt.Sprintf("%s-logs.log", currentDate)

	// 创建日志目录
	if err := os.MkdirAll(logDir, os.ModePerm); err != nil {
		return fmt.Errorf("无法创建日志目录: %w", err)
	}

	// 创建或追加日志文件
	logPath := filepath.Join(logDir, logFile)
	file, err := os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		return fmt.Errorf("无法创建日志文件: %w", err)
	}

	// 设置日志输出到文件
	log.SetOutput(file)
	log.SetFlags(log.LstdFlags | log.Lshortfile)

	return nil
}

type RabbitMQConfig struct {
	RabbitMQ struct {
		Host     string `mapstructure:"host"`
		Port     int    `mapstructure:"port"`
		User     string `mapstructure:"user"`
		Password string `mapstructure:"password"`
	} `mapstructure:"rabbit_mq"`
}

func loadConfig() (*RabbitMQConfig, error) {
	viper.SetConfigName("config")
	viper.SetConfigType("yaml")
	viper.AddConfigPath("config")

	if err := viper.ReadInConfig(); err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %w", err)
	}

	var config RabbitMQConfig
	if err := viper.Unmarshal(&config); err != nil {
		return nil, fmt.Errorf("解析配置失败: %w", err)
	}

	return &config, nil
}
